package com.zhongge.preknow.proxy;


/**
 * @ClassName ProxyUser
 * @Description TODO 代理类 访问、控制、扩展真实的主题
 * @Author zhongge
 * @Version 1.0
 */
public class ProxyUser {
    //代理多个不同用户 所以使用多态
    private User realUser;//被代理的用户

    /**
     * 根据参数代理指定的用户
     * @param realUser
     */
    public ProxyUser(User realUser) {
        this.realUser = realUser;
    }

    //将AdminUser和NormalUser中的所有方法都加进来（代理类起着一个中介作用，自然知道他们的方法）
    public void addBook(String bookName) {
        /**
         * 谁去调用这个方法？ ==》客户端
         *     那么在调用这个方法 的时候 肯定是有ProxyUser对象的
         *     然而new ProxyUser(User realUser) 的时候 前提是你要有具体用户，比如管理员对象或者普通用户对象
         *     new ProxyUser(User realUser)的时候此时对this.realUser进行了初始化
         *     那么再由于向上转型 User realUser   realUser就可以使用 instanceof 来判断realUser是哪一个具体用户，从而控制他的访问权限
         */
        System.out.println("检查管理员特权：");
        if (realUser instanceof AdminUser) {
            //realUser编译时属于 User类 而User类中没有 addBook方法
            //所以进行向下转型
            ((AdminUser) realUser).addBook(bookName);
        }
    }

    //同理：对于普通用户的特权也使用该方法
    public void borrowBook(String bookName) {
        System.out.println("检查普通用户特权：");
        if (realUser instanceof NormalUser) {
            ((NormalUser) realUser).borrowBook(bookName);
        }
    }
}
